package com.project.interceptor;//package guida.ccf.interceptor;
//
//import guida.ccf.common.CustomException;
//import guida.ccf.entity.Admin;
//import guida.ccf.entity.StudentInfo;
//import guida.ccf.service.AdminService;
//import guida.ccf.service.StudentInfoService;
//import guida.ccf.utils.JwtUtils;
//import guida.ccf.utils.RedisUtils;
//import io.jsonwebtoken.Claims;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.HttpStatus;
//import org.springframework.stereotype.Component;
//import org.springframework.web.servlet.HandlerInterceptor;
//import org.springframework.web.servlet.ModelAndView;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//@Component
//@Slf4j
//public class LoginInterceptorToken implements HandlerInterceptor {
//
//    @Autowired
//    private StudentInfoService studentService;
//
//    @Autowired
//    private AdminService adminService;
//
//    /**
//     * 登陆前, 触发的方法.
//     */
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        // 打印请求信息
//        log.info("------------- LoginInterceptor 开始 -------------");
//        long startTime = System.currentTimeMillis();
//        request.setAttribute("requestStartTime", startTime);
//
//        // OPTIONS请求不做校验,
//        // 前后端分离的架构, 前端会发一个OPTIONS请求先做预检, 对预检请求不做校验
//        if(request.getMethod().toUpperCase().equals("OPTIONS")){
//            return true;
//        }
//
//        String path = request.getRequestURL().toString();
//        log.info("接口登录拦截: path：{}", path);
//
//        //获取header的token参数
//        String token = request.getHeader("token");
//        log.info("登录校验开始, token: {}", token);
//        if (token == null || token.isEmpty()) {
//            log.info( "token为空, 请求被拦截" );
//            response.setStatus(HttpStatus.UNAUTHORIZED.value());
//
//            throw new CustomException( "token为空, 请求被拦截" );
//        }
//        Claims claims = JwtUtils.verifyJwt(token);
//        //获取用户ID
//        if (claims == null) {
//            log.warn( "token无效，请求被拦截" );
//            throw new CustomException(401,"token无效，请求被拦截");
//        } else {
//            Object studentId = claims.get("userId");
//            Object adminId = claims.get("adminId");
//            if (studentId != null) {
//                // 学生登录验证
//                // 3. 合成密钥
//                String key = "student-" + studentId;
//                // 5. 从 redis 中拿到 token
//                String redisToken = RedisUtils.getJwtTokenFromRedis(key);
//                StudentInfo byId = studentService.getById(studentId.toString());
//                if (token.equals(redisToken)) {
//                    log.info("已登录: {}", byId);
//                    return true;
//                }
//                throw new CustomException(302, "token无效, 请求被拦截");
//            } else if (adminId != null){
//                // 管理员登陆验证
//                // 3. 合成密钥
//                String key = "admin-" + adminId;
//                // 5. 从 redis 中拿到 token
//                String redisToken = RedisUtils.getJwtTokenFromRedis(key);
//                Admin byId = adminService.getById(adminId.toString());
//
//                if (token.equals(redisToken)) {
//                    log.info("已登录: {}", byId);
//                    return true;
//                }
//                throw new CustomException(302, "token无效, 请求被拦截");
//
//            } else {
//                log.info("信息出错!");
//                return false;
//            }
//        }
//    }
//
//    /**
//     * post 请求触发的函数
//     */
//    @Override
//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        long startTime = (Long) request.getAttribute("requestStartTime");
//        log.info("------------- LoginInterceptor 结束 耗时：{} ms -------------", System.currentTimeMillis() - startTime);
//    }
//
//    /**
//     * 拦截之后触发的函数
//     */
//    @Override
//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//
//        // UserThreadLocal.clear();
//        log.info("LogInterceptor 结束");
//    }
//
//}
